package com.example.demo.java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @ClassName FITest
 * @Description TODO
 * @Author hly
 * @Date 2018\11\28 0028 15:17
 */
public class FITest {

    public void test01(){
        this.con((e)->System.out.println("消费型接口有去无回："+e+"RMB"),66666 );

    }
    //Consumer< T> 消费型接口
    public void con(Consumer<Double> con, double salary){
        con.accept(salary);
    }

    public void test02() {
        List<Integer> list = this.getMathRNum(() ->(int)(Math.random() * 100),10 );
        list.stream()
                .forEach(System.out::println);
    }

    //Supplier : 供给型接口
    //需求：产生任意个数的随机数
    public List<Integer> getMathRNum(Supplier<Integer> sup, int num){
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < num; i++) {
            Integer b = sup.get();
            list.add(b);
        }
        return list;
    }

    public void test03() {
        String str1 = this.strFun((str) -> str.substring(0, 2),"99.29383");
        System.out.println(str1);
    }

    // Function< T, R> : 函数型接口
    // 需求：对一个任意的字符串进行处理，并返回一个经过逻辑处理后的字符串
    public String strFun(Function<String,String> fun, String str){
        return fun.apply(str);
    }

    public void test04() {
        //准备的测试数据
        List<Integer> list = Arrays.asList(1982,1998,2004,1995,2018,1988,1999);
        List<Integer> ints = this.strPred((yar) -> yar >= 1995,list);
        ints.forEach(System.out::println);
    }

    //Predicate : 断言型接口
    //需求：将满足筛选条件的名字放入到集合中，并输出
    public List<Integer> strPred(Predicate<Integer> pre, List<Integer> str){
        List<Integer> list = new ArrayList<>();
        for (Integer string : str) {
            if(pre.test(string)){
                list.add(string);
            }
        }
        return list;
    }

    public static void main(String[] args) {
        FITest fi = new FITest();
        fi.test01();
        fi.test02();
        fi.test03();
        fi.test04();



    }

}
